#include "headfile.h"

void DHT11_SetModeIn(void)
{
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
	
	GPIO_InitTypeDef GPIO_Struct;
	GPIO_Struct.GPIO_Mode = GPIO_Mode_IN;
	GPIO_Struct.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_Struct.GPIO_Pin = GPIO_Pin_3;
	GPIO_Struct.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOA,&GPIO_Struct);
}

void DHT11_SetModeOut(void)
{
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
	
	GPIO_InitTypeDef GPIO_Struct;
	GPIO_Struct.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_Struct.GPIO_OType = GPIO_OType_PP;
	GPIO_Struct.GPIO_Pin = GPIO_Pin_3;
	GPIO_Struct.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOA,&GPIO_Struct);
}

bool DHT11_AskSignal(void)
{
	DHT11_SetModeOut();
	GPIO_SetBits(GPIOA,GPIO_Pin_3);
	GPIO_ResetBits(GPIOA,GPIO_Pin_3);
	delay_ms(20);
	GPIO_SetBits(GPIOA,GPIO_Pin_3);
	delay_us(30);
	
	DHT11_SetModeIn();
	int t = 1;
	
	while(SET == GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3));
	
	while(RESET == GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3) && t <= 80)
	if(t > 80)
	{
		printf("DHT11_AskSignal fail 1\r\n");
		return false;
	}
	
	t = 1;
	while(SET == GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3) && t <= 80)
	{
		delay_us(1);
		t++;
	}
	if(t > 80)
	{
		printf("DHT11_AskSignal fail 2\r\n");
		return false;
	}
	return true;
}

u8 DHT11_RecvBit(void)
{
	DHT11_SetModeIn();
	while(SET == GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3));
	
	while(RESET == GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3));
	
	delay_us(40);
	if(SET == GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3))
		return 1;
	
	return 0;
}

u8 DHT11_RecvData(void)
{
	u8 data = 0;
	for(int i = 7; i >= 0; i--)
	{
		data |= DHT11_RecvBit() << i;
	}
	return data;
}

float hum,tem;

void DHT11_Work(void)
{
	if(true == DHT11_AskSignal())
	{
		u8 data_dht11[5] = {0}; 
		for(int i = 0; i < 5; i++)
			data_dht11[i] = DHT11_RecvData();
		
		if(data_dht11[4] == data_dht11[0] + data_dht11[1] + data_dht11[2] + data_dht11[3])
		{
			hum = data_dht11[0] + (float)data_dht11[1] / 10;
			tem = data_dht11[2] + (float)data_dht11[3] / 10;
		}
		DHT11_SetModeOut();
	}
	else printf("get data fail\r\n");
}
